package almacenes.modelo.dao.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Session;

import almacenes.controlador.constantes.Constantes;
import almacenes.controlador.estado.Estado;
import almacenes.modelo.dao.InspeccionDao;
import almacenes.modelo.entidad.Agrupamiento;
import almacenes.modelo.entidad.Departamento;
import almacenes.modelo.entidad.Inspeccion;
import almacenes.modelo.entidad.InspeccionDetalle;
import almacenes.modelo.entidad.ParametroDet;
import almacenes.modelo.entidad.RolesUsuarioRel;
import almacenes.modelo.entidad.Stockprodagrup;
import almacenes.modelo.entidad.UsuarioMae;
import almacenes.modelo.excepcion.ExcepcionGeneral;

public class InspeccionDaoImpl extends GeneralesDaoImpl implements InspeccionDao{

	private Log logger = LogFactory.getLog(this.getClass());
	
	
	
	public InspeccionDaoImpl(){
		
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Inspeccion> obtenerInspecciones(Session sesion)throws ExcepcionGeneral {
        this.logger.info("obtenerInspecciones");
         String sSql="from Inspeccion";
        return (List<Inspeccion>)listarComboGeneral(sSql,sesion);
	}
	
	/*@SuppressWarnings("unchecked")
	public List<Inspeccion> obtenerInspeccionesFiltro(Session sesion, Inspeccion objInspeccion ) throws ExcepcionGeneral{
		 this.logger.info("obtenerInspeccionesFiltro");
		 objInspeccion.setIdUsuarioGestor(obtenerUsuarioPrueba(sesion).getIdUsuario());
		 String sSql=" select n from Inspeccion n where n.idProveedor="+objInspeccion.getIdProveedor()+
				 " and n.idUsuarioGestor =" +objInspeccion.getIdUsuarioGestor()+""+ 
				 " and n.fecReg between '"+ objInspeccion.getFecReg()+"' and '"+objInspeccion.getFecAct()+
				 "' and n.idEstadoInspec = "+objInspeccion.getIdEstadoInspec()+"";
		 return (List<Inspeccion>)listarComboGeneral(sSql,sesion); 
	}*/
	
	@SuppressWarnings("unchecked")
	@Override
	public List<Inspeccion> obtenerInspeccionesFiltro(Session sesion, Inspeccion objInspeccion ) throws ExcepcionGeneral{
	List<Inspeccion> lstInspec = new ArrayList<Inspeccion>();
		this.logger.info("obtenerInspeccionesFiltro");
		try {
			this.logger.info("try");
			 objInspeccion.setIdUsuarioGestor(obtenerUsuarioPrueba(sesion).getIdUsuario());
			//iniciaOperacion();
			lstInspec = sesion
					.getNamedQuery("buscaInspecciones")
					.setParameter("AC_ID_GESTOR",objInspeccion.getIdUsuarioGestor()==-1?"":objInspeccion.getIdUsuarioGestor())
					.setParameter("AC_ID_OPE_LOG", objInspeccion.getIdProveedor()==-1?"":objInspeccion.getIdProveedor())
					.setParameter("AC_ESTADO", objInspeccion.getIdEstadoInspec()==-1?"":objInspeccion.getIdEstadoInspec())
					.setParameter("AD_FEC_REG_INI", objInspeccion.getFecReg()==null?"":objInspeccion.getFecReg())
					.setParameter("AD_FEC_REG_FIN", objInspeccion.getFecAct()==null?"":objInspeccion.getFecAct())
					.list();
			int con = 0;
			for (Inspeccion inspeccion : lstInspec) {
				if(inspeccion.getIdEstadoInspec()==1){
					//inspeccion.setsNombreEstado("Vigente");
				}
				else
					//inspeccion.setsNombreEstado("No vigente");
				
				++con;
			}
			
			System.out.println("CANTIDAD DE Inspeccion: "+lstInspec.size());

		} catch (Exception ex) {
			ex.printStackTrace();
			this.logger.error("Error al obetener la lista de inspecciones:");
			this.logger.error(ex.getMessage());
			this.logger.error(ex.getCause());
			this.logger.error(ex.getLocalizedMessage());
			throw new ExcepcionGeneral("Error al obetener la lista de inspecciones");
		} finally {
		//	sesion.close();
		}

		return lstInspec;
}



	
	@SuppressWarnings("unchecked")
	@Override
	public String insertarInspeccion(Session sesion, Inspeccion objInspeccion)throws ExcepcionGeneral {
		String sSqlStock = "";
	    List<InspeccionDetalle> lstInspeccionDetalle  = new ArrayList<InspeccionDetalle>();
	    InspeccionDetalle objInspeccionDetalle = null;
		List<Stockprodagrup> lstStockprodagrup = new ArrayList<Stockprodagrup>();
		
		sSqlStock  = "select a from Stockprodagrup a" +
				" where a.agrupamiento.departamentoxproveedor.proveedor.idProveedor="
				 + objInspeccion.getIdProveedor() 
				 + " and a.agrupamiento.departamentoxproveedor.departamento.idDepartamento="+objInspeccion.getIdDepartamento()
				 + " and a.agrupamiento.idAgrupamiento="+objInspeccion.getIdFeria() 
				 + " and a.agrupamiento.idAgrupamiento="+objInspeccion.getIdCampanha()
				 + " and a.agrupamiento.departamentoxproveedor.departamento.idDepartamento " +
				 " in (select n.departamento.idDepartamento from RolesUsuarioRel n" +
				 " where n.usuarioMae.idUsuario= "+ objInspeccion.getIdUsuarioGestor() + " )";
		lstStockprodagrup = (List<Stockprodagrup>) listarComboGeneral(sSqlStock, sesion);
		ParametroDet objParametroDet =obtenerEstadoEspexcifico(Estado.EST_PRODUCTO_INSPECCIONADO, Estado.EST_09_CONFORME,sesion);
		
		for (Stockprodagrup stockprodagrup : lstStockprodagrup) {
			objInspeccionDetalle=new InspeccionDetalle();
			objInspeccionDetalle.setInspeccion(objInspeccion);
			objInspeccionDetalle.setStockprodagrup(stockprodagrup);
			objInspeccionDetalle.setIdEstadoProdInsp(objParametroDet.getCodigo());
			objInspeccionDetalle.setUsuReg(objInspeccion.getUsuReg());
			objInspeccionDetalle.setFlagNoConfor(false);
			objInspeccionDetalle.setFecReg(new Date());
			lstInspeccionDetalle.add(objInspeccionDetalle);
		}
		 objInspeccion.setFecReg(new Date());
		 objInspeccion.setInspeccionDetalles(lstInspeccionDetalle);
		 return InsertGeneral(objInspeccion, sesion);
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Departamento> obtenerDepartamentos(int iProveedor, Session sesion) throws ExcepcionGeneral {
		String sSql=" select e.departamento from Departamentoxproveedor e where e.proveedor.idProveedor=" +iProveedor;
		return (List<Departamento>)listarComboGeneral(sSql,sesion);
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<InspeccionDetalle> obtenerDetalleInspeccion(int iInspeccion, Session sesion) throws ExcepcionGeneral {
		String sSql=" select e from InspeccionDetalle e where e.inspeccion.idInspeccion=" +iInspeccion;
		return (List<InspeccionDetalle>)listarComboGeneral(sSql,sesion);
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public List<Agrupamiento> obtenerCampania(int iProveedor,int iParametro, Session sesion) throws ExcepcionGeneral {
   	String sSql="select a from Agrupamiento a where a.departamentoxproveedor.departamento.idDepartamento="+iParametro +
   			" and a.departamentoxproveedor.proveedor.idProveedor="+iProveedor
				+" and tipoAgrupamiento.idTipoAgrupamiento=1 and a.idEstadoMae=1";
		return (List<Agrupamiento>)listarComboGeneral(sSql,sesion);
	}
	@SuppressWarnings("unchecked")
	@Override
	public List<Agrupamiento> obtenerPremio(int iProveedor,int iDepto, int iCampania, Session sesion) throws ExcepcionGeneral {
		String sSql="select a from Agrupamiento a where a.departamentoxproveedor.departamento.idDepartamento="+iDepto +
   			" and a.departamentoxproveedor.proveedor.idProveedor="+iProveedor+
				" and a.agrupamiento.idAgrupamiento="+iCampania
				+" and a.tipoAgrupamiento.idTipoAgrupamiento=2 and a.idEstadoMae=1 ";
		return (List<Agrupamiento>)listarComboGeneral(sSql,sesion);
	}
	@SuppressWarnings("unchecked")
	@Override
	public List<Agrupamiento> obtenerFeria(int iProveedor,int iDepto, Session sesion)throws ExcepcionGeneral {
		String sSql="select a from Agrupamiento a where a.departamentoxproveedor.departamento.idDepartamento="+iDepto +
   			" and a.departamentoxproveedor.proveedor.idProveedor="+iProveedor 
				+" and tipoAgrupamiento.idTipoAgrupamiento=3 and a.idEstadoMae=1";
		return (List<Agrupamiento>)listarComboGeneral(sSql,sesion);
	}
	public UsuarioMae obtenerUsuarioPrueba(Session sesion)throws ExcepcionGeneral {
		String sSql="select a from UsuarioMae a where a.idUsuario=62";
		UsuarioMae objUsu = (UsuarioMae)listarComboGeneral(sSql,sesion).get(0);
		System.out.println("objUsu " +objUsu.getIdUsuario());
		System.out.println("objUsu " +objUsu.getRolesUsuarioRelsForIdUsuario().get(0).getRolMae().getDescripcion());
		return  objUsu;
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public List<UsuarioMae> obtenerGestoresAlmacen(int iOpeLog,UsuarioMae objUsuario,int iDepto, Session sesion) throws ExcepcionGeneral {
		int i=0,j=0;
		String sSql="";
		objUsuario = new UsuarioMae();
		objUsuario =this.obtenerUsuarioPrueba(sesion);
		List<UsuarioMae> lstUsuarioReturn = new ArrayList<UsuarioMae>();
		iniciaOperacion();
		if(objUsuario.getRolesUsuarioRelsForIdUsuario()!=null && objUsuario.getRolesUsuarioRelsForIdUsuario().size()>0){
			
			for (RolesUsuarioRel objRol : objUsuario.getRolesUsuarioRelsForIdUsuario()) {
				logger.debug("Id del Rol :  " + objRol.getRolMae().getIdRol() +" Descripcion del Rol : " +objRol.getRolMae().getDescripcion());
			if(objRol.getRolMae().getIdRol()==Constantes.ROL_SUPERVISOR){
				++i;
			}else if(objRol.getRolMae().getIdRol()==Constantes.ROL_GESTOR){
				++j;
			}else {
				logger.debug("En el else del objUsuario.getRolesUsuarioRels()");
			}
		  }
			
			if(i>0 && j>0){
				 sSql="select a from UsuarioMae a where a.rolesUsuarioRels.rolMae.idRol=1" +
				 		" a.rolesUsuarioRels.rolMae.departamento.idDepartamento="+iDepto;
				 lstUsuarioReturn =(List<UsuarioMae>)listarComboGeneral(sSql,sesion);
			}else if(i==0 && j>0){
				lstUsuarioReturn.add(objUsuario);
			}else{
				logger.debug("En el else de i y j");
			}
			
		}
		
		
	 return lstUsuarioReturn;
	}

	

	
	
	


}
